home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / modula2f.zip / WINDOWS.MOD < prev    next >
Text File  |  1992-06-24  |  10KB  |  421 lines

  1. IMPLEMENTATION MODULE Windows;
  2.  
  3. FROM SYSTEM IMPORT ASSEMBLER;
  4. FROM Strings IMPORT Length;
  5. FROM Text IMPORT Color, GetKey, Write, SetCursor;
  6. FROM Screen IMPORT SaveScreen, RestoreScreen;
  7.  
  8. VAR watr:CARDINAL;
  9.     current:Window;
  10.  
  11. PROCEDURE Clw();
  12.     VAR up,dn,lf,rt:CARDINAL;
  13.     BEGIN
  14.         up:=current.t;
  15.         dn:=current.b;
  16.         lf:=current.l;
  17.         rt:=current.r;
  18.         ASM
  19.             MOV CH,up
  20.             MOV CL,lf
  21.             MOV DH,dn
  22.             MOV DL,rt
  23.             MOV BH,watr
  24.             XOR AL,AL
  25.             MOV AH,6
  26.             INT 10H
  27.             MOV DH,up
  28.             MOV DL,lf
  29.             XOR BH,BH
  30.             MOV AH,2
  31.             INT 10H
  32.         END;
  33.      END Clw;
  34.  
  35. PROCEDURE WSetCursor(v,h:CARDINAL);
  36.     BEGIN
  37.         v:=v+current.t;
  38.         h:=h+current.l;
  39.         IF v>current.b THEN
  40.             v:=current.b;
  41.         END; (* if *)
  42.         IF h>current.r THEN
  43.             h:=current.r;
  44.         END;
  45.         SetCursor(v,h);
  46.     END WSetCursor;
  47.  
  48. PROCEDURE MakeWindow(v,h,height,width,fcolor,bcolor:CARDINAL;
  49.                      title:Title; VAR w:Window);
  50.     BEGIN
  51.         w.t:=v;
  52.         w.b:=v+height-1;
  53.         w.l:=h;
  54.         w.r:=h+width-1;
  55.         w.fc:=fcolor;
  56.         w.bc:=bcolor;
  57.         w.ttl:=title;
  58.     END MakeWindow;
  59.  
  60. PROCEDURE GetAttrib(VAR oatr:CARDINAL);
  61.     BEGIN
  62.         ASM
  63.             LES DI,oatr
  64.             XOR BH,BH
  65.             MOV AH,8
  66.             INT 10H
  67.             MOV ES:[DI],AH
  68.         END;
  69.     END GetAttrib;
  70.  
  71. PROCEDURE SetWindow(VAR w:Window);
  72.     BEGIN
  73.         current.t := w.t;
  74.         current.b := w.b;
  75.         current.l := w.l;
  76.         current.r := w.r;
  77.         watr := (w.bc MOD 8) * 16 + (w.fc MOD 16);
  78.     END SetWindow;
  79.  
  80. PROCEDURE PutWindow(VAR w:Window);
  81.     VAR h,v,f,b,i:CARDINAL;
  82.     BEGIN
  83.         SetWindow(w);
  84.         SaveScreen(w.dat);
  85.  
  86.             (* draw border *)
  87.  
  88.         v:=w.t-1; h:=w.l-1;
  89.         SetCursor(24,0);
  90.         GetAttrib(i);
  91.         f:=i MOD 16;
  92.         b:=i DIV 16;
  93.         SetCursor(v,h);
  94.         Color(w.fc,w.bc);
  95.         Write(CHR(201));
  96.         IF Length(w.ttl)>0 THEN
  97.             Write(CHR(181));
  98.             INC(h);
  99.             FOR i:=0 TO Length(w.ttl)-1 DO
  100.                 Write(w.ttl[i]);
  101.                 INC(h);
  102.             END; (* for *)
  103.             Write(CHR(198));
  104.             INC(h);
  105.         END; (* if *)
  106.         WHILE h<w.r DO
  107.             Write(CHR(205));
  108.             INC(h);
  109.         END; (* while *)
  110.         Write(CHR(187));
  111.         FOR v:=w.t TO w.b DO
  112.             SetCursor(v,w.l-1);
  113.             Write(CHR(186));
  114.             SetCursor(v,w.r+1);
  115.             Write(CHR(186));
  116.         END; (* for *)
  117.         SetCursor(w.b+1,w.l-1);
  118.         Write(CHR(200));
  119.         FOR h:=w.l TO w.r DO
  120.             Write(CHR(205));
  121.         END; (* for *)
  122.         Write(CHR(188));
  123.  
  124.         Clw;
  125.  
  126.         Color(f,b);
  127.     END PutWindow;
  128.  
  129. PROCEDURE RemoveWindow(VAR w:Window);
  130.     VAR f,b,i:CARDINAL;
  131.     BEGIN
  132.         RestoreScreen(w.dat);
  133.     END RemoveWindow;
  134.  
  135. PROCEDURE ScrollUp(count:CARDINAL);
  136.     VAR up,dn,lf,rt:CARDINAL;
  137.     BEGIN
  138.         up:=current.t;
  139.         dn:=current.b;
  140.         lf:=current.l;
  141.         rt:=current.r;
  142.         ASM
  143.             MOV CH,up
  144.             MOV CL,lf
  145.             MOV DH,dn
  146.             MOV DL,rt
  147.             MOV BH,watr
  148.             MOV AL,count
  149.             MOV AH,6
  150.             INT 10H
  151.             MOV DH,up
  152.             MOV DL,lf
  153.             XOR BH,BH
  154.             MOV AH,2
  155.             INT 10H
  156.         END;
  157.     END ScrollUp;
  158.  
  159. PROCEDURE ScrollDown(count:CARDINAL);
  160.     VAR up,dn,lf,rt:CARDINAL;
  161.     BEGIN
  162.         up:=current.t;
  163.         dn:=current.b;
  164.         lf:=current.l;
  165.         rt:=current.r;
  166.         ASM
  167.             MOV CH,up
  168.             MOV CL,lf
  169.             MOV DH,dn
  170.             MOV DL,rt
  171.             MOV BH,watr
  172.             MOV AL,count
  173.             MOV AH,7
  174.             INT 10H
  175.             MOV DH,up
  176.             MOV DL,lf
  177.             XOR BH,BH
  178.             MOV AH,2
  179.             INT 10H
  180.         END;
  181.     END ScrollDown;
  182.     
  183. PROCEDURE WRead(VAR ch:CHAR);
  184.     VAR key,scan:CHAR;
  185.     BEGIN
  186.         GetKey(key,scan);
  187.         WWrite(key);
  188.         ch:=key;
  189.     END WRead;
  190.  
  191. PROCEDURE WReadCard(VAR n:CARDINAL);
  192.     VAR str:ARRAY [0..5] OF CHAR;
  193.           i:CARDINAL;
  194.     BEGIN
  195.         WReadString(str);
  196.         n:=0;
  197.         IF Length(str) > 0 THEN
  198.             FOR i:=0 TO Length(str)-1 DO
  199.                 IF (str[i] >= '0') AND (str[i] <= '9') THEN
  200.                     n:=10*n+(ORD(str[i])-ORD('0'));
  201.                 END; (* if *)
  202.             END; (* for *)
  203.        END; (* if *)
  204.     END WReadCard;
  205.  
  206. PROCEDURE WReadInt(VAR i:INTEGER);
  207.     VAR str:ARRAY [0..6] OF CHAR;
  208.         c:CHAR;
  209.         x:CARDINAL;
  210.         p:INTEGER;
  211.         neg:BOOLEAN;
  212.     BEGIN
  213.         WReadString(str);
  214.         neg:=FALSE;
  215.         i:=0; p:=0;
  216.         IF Length(str) > 0 THEN
  217.             x:=0;
  218.             IF str[x] = "-" THEN
  219.                 neg:=TRUE; INC(x);
  220.             END; (* if *)
  221.             WHILE x < Length(str) DO
  222.                 IF (str[x] >= '0') AND (str[x] <= '9') THEN
  223.                     p:=10*p; c:=str[x];
  224.                     ASM
  225.                         XOR AX,AX
  226.                         MOV AL,c
  227.                         SUB AX,48
  228.                         ADD p,AX
  229.                     END;
  230.                     (* (ORD(str[x])-ORD('0')); *)
  231.                 END; (* if *)
  232.                 INC(x);
  233.             END; (* while *)
  234.         END; (* if *)
  235.         IF neg THEN
  236.             p:=-1*p;
  237.         END; (* if *)
  238.         i:=p;
  239.     END WReadInt;
  240.  
  241. PROCEDURE WReadString(VAR str:ARRAY OF CHAR);
  242.     VAR i:CARDINAL;
  243.         ch,sc:CHAR;
  244.     BEGIN
  245.         i:=0;
  246.         GetKey(ch,sc);
  247.         WHILE ch<>CHR(13) DO
  248.             IF (sc=CHR(14)) OR (sc=CHR(75)) THEN
  249.                 IF i>0 THEN
  250.                     DEC(i);
  251.                     ASM
  252.                         MOV AL,8
  253.                         MOV AH,14
  254.                         INT 10H
  255.                         MOV AL,32
  256.                         MOV AH,14
  257.                         INT 10H
  258.                         MOV AL,8
  259.                         MOV AH,14
  260.                         INT 10H
  261.                     END;
  262.                 END; (* if *)
  263.             ELSE
  264.                 WWrite(ch);
  265.                 str[i]:=ch;
  266.                 INC(i);
  267.             END; (* if *)
  268.             GetKey(ch,sc);
  269.         END; (* while *)
  270.         str[i]:=CHR(0);
  271.         WWriteLn;
  272.     END WReadString;
  273.  
  274. PROCEDURE WWriteString(str:ARRAY OF CHAR);
  275.     VAR i:CARDINAL;
  276.  
  277.     BEGIN
  278.         IF Length(str) > 0 THEN
  279.             FOR i:=0 TO Length(str)-1 DO
  280.                 WWrite(str[i]);
  281.             END; (* for *)
  282.         END; (* if *)
  283.     END WWriteString;
  284.  
  285. PROCEDURE WWriteCard(n,lngth:CARDINAL);
  286.     VAR buf:ARRAY [1..10] OF CHAR;
  287.         ln:CARDINAL;
  288.     BEGIN
  289.         IF lngth > 10 THEN
  290.             lngth:=10;
  291.         END; (* if *)
  292.         FOR ln:=1 TO 10 DO
  293.             buf[ln]:=CHR(0);
  294.         END; (* for *)
  295.         ln:=lngth;
  296.         buf[ln]:='0';
  297.         WHILE (n>0) AND (ln>0) DO
  298.             buf[ln]:=CHR((n MOD 10) + 48);
  299.             n:=n DIV 10;
  300.             DEC(ln);
  301.         END; (* while *)
  302.         FOR n:=1 TO lngth DO
  303.             WWrite(buf[n]);
  304.         END; (* for *)
  305.     END WWriteCard;
  306.  
  307. PROCEDURE WWriteInt(n:INTEGER; lngth:CARDINAL);
  308.     VAR buf:ARRAY [1..10] OF CHAR;
  309.         ln,c:CARDINAL;
  310.         neg:BOOLEAN;
  311.     BEGIN
  312.         IF lngth > 10 THEN
  313.             lngth:=10;
  314.         END; (* if *)
  315.         FOR ln:=1 TO 10 DO
  316.             buf[ln]:=CHR(0);
  317.         END; (* for *)
  318.         IF n<0 THEN
  319.             neg:=TRUE;
  320.             n:=-n;
  321.         ELSE
  322.             neg:=FALSE;
  323.         END; (* if *)
  324.             ASM
  325.                 MOV AX,n
  326.                 MOV c,AX
  327.             END;
  328.         ln:=lngth;
  329.         buf[ln]:='0';
  330.         WHILE (c>0) AND (ln>0) DO
  331.             buf[ln]:=CHR((c MOD 10)+48);
  332.             c:=c DIV 10;
  333.             DEC(ln);
  334.         END; (* while *)
  335.         IF (ln>0) AND neg THEN
  336.             buf[ln]:='-';
  337.             DEC(ln);
  338.         END; (* if *)
  339.         FOR ln:=1 TO lngth DO
  340.             WWrite(buf[ln]);
  341.         END; (* for *)
  342.     END WWriteInt;
  343.  
  344. PROCEDURE WWrite(ch:CHAR);
  345.     VAR rt,dn,lf,up:CARDINAL;
  346.     BEGIN
  347.         lf:=current.l;
  348.         dn:=current.b;
  349.         rt:=current.r;
  350.         up:=current.t;
  351.         ASM
  352.             MOV CX,1
  353.             MOV BL,watr
  354.             XOR BH,BH
  355.             MOV AL,ch
  356.             MOV AH,9
  357.             INT 10H
  358.             MOV AH,3
  359.             INT 10H
  360.             INC DL
  361.             MOV CL,DL
  362.             XOR CH,CH
  363.             CMP CX,rt
  364.             JLE SETC
  365.             MOV DL,lf
  366.             INC DH
  367.             MOV CL,DH
  368.             CMP CX,dn
  369.             JLE SETC
  370.             MOV BH,watr
  371.             MOV CH,up
  372.             MOV CL,lf
  373.             MOV DH,dn
  374.             MOV DL,rt
  375.             MOV AL,1
  376.             MOV AH,6
  377.             INT 10H
  378.             MOV DL,lf
  379.     SETC:   MOV AH,2
  380.             INT 10H
  381.         END;
  382.     END WWrite;
  383.  
  384. PROCEDURE WWriteLn();
  385.     VAR lf,dn,rt,up:CARDINAL;
  386.     BEGIN
  387.         lf:=current.l;
  388.         dn:=current.b;
  389.         rt:=current.r;
  390.         up:=current.t;
  391.         ASM
  392.             XOR BH,BH
  393.             MOV AH,3
  394.             INT 10H
  395.             INC DH
  396.             CMP DH,dn
  397.             JLE SETC
  398.             MOV BH,watr
  399.             MOV CH,up
  400.             MOV CL,lf
  401.             MOV DH,dn
  402.             MOV DL,rt
  403.             MOV AL,1
  404.             MOV AH,6
  405.             INT 10H
  406.     SETC:   MOV DL,lf
  407.             MOV AH,2
  408.             INT 10H
  409.         END;
  410.     END WWriteLn;
  411.  
  412. BEGIN
  413.     watr:=7;
  414.     current.t:=0;
  415.     current.b:=24;
  416.     current.l:=0;
  417.     current.r:=79;
  418.     current.fc:=7;
  419.     current.bc:=0;
  420.     current.ttl:='';
  421. END Windows.